Introduction
This is a template for a data analysis folder that can be easily exported as a webpage or as Supplementary Materials (e.g., as a word document). The README page of the repository, alongside the webpage and word document, were all created from the index.Rmd file that you can edit.
Installation
- How to use this template?
Download it (click here to download), unzip it and edit. Alternatively, you click on the Use this template button at the top of this screen to create a GitHub repository with all the content copied (then you just need to clone the repo to your local machine).
- How to upload it to a website?
If your repo is not already connected to GitHub, then create a new repository and upload all the content (so that it looks like this repo). Then, go to settings and enable GitHub pages (i.e., that gives you a webpage from an html stored on GitHub), and select the docs/ folder as the location of the webpage. Indeed, rendering (knitting) the files will generate an “index.html” file in the /docs/ folder, which is used as the website. You can see an example at https://realitybending.github.io/TemplateResults/.
In this repo, with have set up a GitHub action that generates all the output files everytime someone commit to the repository. This means that the final documents here are always “up-to-date” with the Rmds (as shown by the green badge). That said, you can remove this GitHub action (just remove the .github/workflows/website.yml file) if you prefer to generate the documents manually only.
References have to be added in bib format in the utils/bibliography.bib file, and further referenced in the text like this [@ludecke2019insight] (Lüdecke, Waggoner, & Makowski, 2019).
- It doesn’t work / I have questions / I have ideas
Just open an issue and we’ll be happy to assist ☺
Structure
Most files that you’ll need to create / edit will be written in rmarkdown, which consists of a mix of markdown text and R chunks of code.
The main file is named index.Rmd. However, to avoid having overly long files, the different (and independent) analyses parts are actually split in other documents. For instance, in this template example, the descriptive statistics section is in the 1_descriptive.Rmd file. As you can see in the index file, this file is then integrated as a child document (i.e., it is merged). This makes it very convenient to have a clear structure with well-organized files, that are put together only when merged.
Render and Publish
Importantly, in order to render all the files, do not Knit this document by pressing the ‘Knit’ button. If you do, it will create an output file (for instance index.html) in the root folder, alongside index.Rmd. This is not what we want, as we want to keep the output files tidy in separate folders (for instance, the html version should be in the /docs/ folder, as this is where the website will look for).
There an R script, utils/render.R, that contains the lines to render everything in its correct location. So, when you have the “index.Rmd” file opened (and your working directory is at its root), simply run source("utils/render.R") in the console (or the relevant lines in that file). This will run the rendering file and create all the files.
Contribution
Do not hesitate to improve this template by updating, documenting, or expanding it!
Packages & Data
Packages
library(easystats)
summary(report::report(sessionInfo()))
The analysis was done using the R Statistical language (v4.0.3; R Core Team, 2020) on macOS Catalina 10.15.7, using the packages effectsize (v0.4.3.2), ggplot2 (v3.3.3), stringr (v1.4.0), tidyr (v1.1.2), forcats (v0.5.1), readr (v1.4.0), dplyr (v1.0.4), rmarkdown (v2.6), tibble (v3.0.6), purrr (v0.3.4), parameters (v0.11.0.1), insight (v0.12.0.1), see (v0.6.2.1), performance (v0.7.0), modelbased (v0.5.1), easystats (v0.2.0), correlation (v0.5.1), bayestestR (v0.8.2.1), report (v0.2.0) and tidyverse (v1.3.0).
Data
df <- read.csv("data/data.csv")
cat(paste("The data consists of",
report::report_participants(df,
participants = "Participant",
age = "Age")))
The data consists of 10 participants (Mean age = 29.9, SD = 0.5, range: [29.0, 30.91])
Full Code
The full script of executive code contained in this document is reproduced here.
# Set up the environment (or use local alternative `source("utils/config.R")`)
source("https://raw.githubusercontent.com/RealityBending/TemplateResults/main/utils/config.R")
fast <- FALSE # Make this false to skip the chunks
library(easystats)
summary(report::report(sessionInfo()))
df <- read.csv("data/data.csv")
cat(paste("The data consists of",
report::report_participants(df,
participants = "Participant",
age = "Age")))
report::cite_packages(sessionInfo())
ggplot(df, aes(x=V1, y=V2, color=Participant)) +
geom_point() +
see::theme_modern()
1+1
LS0tCnRpdGxlOiAiKipSZXN1bHRzIFRlbXBsYXRlKioiCnN1YnRpdGxlOiAiQSBTdWJ0aXRsZSIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICB0aGVtZTogY2VydWxlYW4KICAgIGhpZ2hsaWdodDogInB5Z21lbnRzIgogICAgdG9jOiB0cnVlCiAgICB0b2NfZGVwdGg6IDMKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgbnVtYmVyX3NlY3Rpb25zOiBmYWxzZQogICAgZGZfcHJpbnQ6ICJrYWJsZSIKICAgIGNvZGVfZm9sZGluZzogaGlkZQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogIHdvcmRfZG9jdW1lbnQ6CiAgICByZWZlcmVuY2VfZG9jeDogdXRpbHMvVGVtcGxhdGVfV29yZC5kb2N4CiAgICBoaWdobGlnaHQ6ICJweWdtZW50cyIKICAgIHRvYzogZmFsc2UKICAgIHRvY19kZXB0aDogMwogICAgZGZfcHJpbnQ6ICJrYWJsZSIKICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQogIHJtYXJrZG93bjo6aHRtbF92aWduZXR0ZToKICAgIHRvYzogdHJ1ZQogICAgdG9jX2RlcHRoOiAzCmVkaXRvcl9vcHRpb25zOiAKICBjaHVua19vdXRwdXRfdHlwZTogY29uc29sZQpiaWJsaW9ncmFwaHk6IHV0aWxzL2JpYmxpb2dyYXBoeS5iaWIKY3NsOiB1dGlscy9hcGEuY3NsCi0tLQoKCjwhLS0gCiEhISEgSU1QT1JUQU5UOiBydW4gYHNvdXJjZSgidXRpbHMvcmVuZGVyLlIiKWAgdG8gcHVibGlzaCBpbnN0ZWFkIG9mIGNsaWNraW5nIG9uICdLbml0JwotLT4KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQojIFNldCB1cCB0aGUgZW52aXJvbm1lbnQgKG9yIHVzZSBsb2NhbCBhbHRlcm5hdGl2ZSBgc291cmNlKCJ1dGlscy9jb25maWcuUiIpYCkKc291cmNlKCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vUmVhbGl0eUJlbmRpbmcvVGVtcGxhdGVSZXN1bHRzL21haW4vdXRpbHMvY29uZmlnLlIiKSAgCgpmYXN0IDwtIEZBTFNFICAjIE1ha2UgdGhpcyBmYWxzZSB0byBza2lwIHRoZSBjaHVua3MKYGBgCgojIEludHJvZHVjdGlvbgoKIVtXZWJzaXRlXShodHRwczovL2dpdGh1Yi5jb20vUmVhbGl0eUJlbmRpbmcvVGVtcGxhdGVSZXN1bHRzL3dvcmtmbG93cy9XZWJzaXRlL2JhZGdlLnN2ZykKClRoaXMgaXMgYSB0ZW1wbGF0ZSBmb3IgYSBkYXRhIGFuYWx5c2lzIGZvbGRlciB0aGF0IGNhbiBiZSBlYXNpbHkgZXhwb3J0ZWQgYXMgYSBbKip3ZWJwYWdlKipdKGh0dHBzOi8vcmVhbGl0eWJlbmRpbmcuZ2l0aHViLmlvL1RlbXBsYXRlUmVzdWx0cy8pIG9yIGFzICoqU3VwcGxlbWVudGFyeSBNYXRlcmlhbHMqKiAoZS5nLiwgYXMgYSBbd29yZCBkb2N1bWVudF0oaHR0cHM6Ly9yZWFsaXR5YmVuZGluZy5naXRodWIuaW8vVGVtcGxhdGVSZXN1bHRzL3dvcmQvKSkuIFRoZSBSRUFETUUgcGFnZSBvZiB0aGUgcmVwb3NpdG9yeSwgYWxvbmdzaWRlIHRoZSB3ZWJwYWdlIGFuZCB3b3JkIGRvY3VtZW50LCB3ZXJlIGFsbCBjcmVhdGVkIGZyb20gdGhlIFtpbmRleC5SbWRdKGh0dHBzOi8vZ2l0aHViLmNvbS9SZWFsaXR5QmVuZGluZy9UZW1wbGF0ZVJlc3VsdHMvYmxvYi9tYWluL2luZGV4LlJtZCkgZmlsZSB0aGF0IHlvdSBjYW4gZWRpdC4KCiMjIEZlYXR1cmVzCgotIFt4XSBSZW5kZXJlZCBhcyBhIFtSRUFETUUgcGFnZV0oaHR0cHM6Ly9naXRodWIuY29tL1JlYWxpdHlCZW5kaW5nL1RlbXBsYXRlUmVzdWx0cy9ibG9iL21haW4vUkVBRE1FLm1kKSwgYSBbcHVibGlzaGVkIHdlYnNpdGVdKGh0dHBzOi8vcmVhbGl0eWJlbmRpbmcuZ2l0aHViLmlvL1RlbXBsYXRlUmVzdWx0cy8pIGFuZCBhIFt3b3JkIGRvY3VtZW50XShodHRwczovL2dpdGh1Yi5jb20vUmVhbGl0eUJlbmRpbmcvVGVtcGxhdGVSZXN1bHRzL3Jhdy9tYWluL3dvcmQvU3VwcGxlbWVudGFyeU1hdGVyaWFscy5kb2N4KQotIFt4XSBBUEEgY2l0YXRpb25zCi0gW3hdIFRpZHkgb3JnYW5pc2F0aW9uIChzZXBhcmF0ZSBmaWxlcyBmb3IgaW5kZXBlbmRlbnQgYW5hbHlzZXMpCi0gW3hdIEdyZWF0IGRlZmF1bHQgY29uZmlndXJhdGlvbgotIFt4XSBBbmQgbW9yZSEKCiMjIEluc3RhbGxhdGlvbgoKLSAqKkhvdyB0byB1c2UgdGhpcyB0ZW1wbGF0ZT8qKgoKRG93bmxvYWQgaXQgKFsqKmNsaWNrIGhlcmUgdG8gZG93bmxvYWQqKl0oaHR0cHM6Ly9naXRodWIuY29tL1JlYWxpdHlCZW5kaW5nL1RlbXBsYXRlUmVzdWx0cy9hcmNoaXZlL21haW4uemlwKSksIHVuemlwIGl0IGFuZCBlZGl0LgpBbHRlcm5hdGl2ZWx5LCB5b3UgY2xpY2sgb24gdGhlIFsqKlVzZSB0aGlzIHRlbXBsYXRlKipdKGh0dHBzOi8vZ2l0aHViLmNvbS9SZWFsaXR5QmVuZGluZy9UZW1wbGF0ZVJlc3VsdHMvZ2VuZXJhdGUpIGJ1dHRvbiBhdCB0aGUgdG9wIG9mIHRoaXMgc2NyZWVuIHRvIGNyZWF0ZSBhIEdpdEh1YiByZXBvc2l0b3J5IHdpdGggYWxsIHRoZSBjb250ZW50IGNvcGllZCAodGhlbiB5b3UganVzdCBuZWVkIHRvIGNsb25lIHRoZSByZXBvIHRvIHlvdXIgbG9jYWwgbWFjaGluZSkuCgoKLSAqKkhvdyB0byB1cGxvYWQgaXQgdG8gYSB3ZWJzaXRlPyoqCgpJZiB5b3VyIHJlcG8gaXMgbm90IGFscmVhZHkgY29ubmVjdGVkIHRvIEdpdEh1YiwgdGhlbiBjcmVhdGUgYSBuZXcgcmVwb3NpdG9yeSBhbmQgdXBsb2FkIGFsbCB0aGUgY29udGVudCAoc28gdGhhdCBpdCBsb29rcyBsaWtlIHRoaXMgcmVwbykuIFRoZW4sIGdvIHRvIHNldHRpbmdzIGFuZCBlbmFibGUgKipHaXRIdWIgcGFnZXMqKiAoaS5lLiwgdGhhdCBnaXZlcyB5b3UgYSB3ZWJwYWdlIGZyb20gYW4gaHRtbCBzdG9yZWQgb24gR2l0SHViKSwgYW5kIHNlbGVjdCB0aGUgYGRvY3MvYCBmb2xkZXIgYXMgdGhlIGxvY2F0aW9uIG9mIHRoZSB3ZWJwYWdlLiBJbmRlZWQsIHJlbmRlcmluZyAoa25pdHRpbmcpIHRoZSBmaWxlcyB3aWxsIGdlbmVyYXRlIGFuICJpbmRleC5odG1sIiBmaWxlIGluIHRoZSBgL2RvY3MvYCBmb2xkZXIsIHdoaWNoIGlzIHVzZWQgYXMgdGhlIHdlYnNpdGUuIFlvdSBjYW4gc2VlIGFuIGV4YW1wbGUgYXQgW2h0dHBzOi8vcmVhbGl0eWJlbmRpbmcuZ2l0aHViLmlvL1RlbXBsYXRlUmVzdWx0cy9dKGh0dHBzOi8vcmVhbGl0eWJlbmRpbmcuZ2l0aHViLmlvL1RlbXBsYXRlUmVzdWx0cy8pLgoKLSAqKlRvIGtuaXQgb3Igbm90IHRvIGtuaXQqKgoKSW4gdGhpcyByZXBvLCB3aXRoIGhhdmUgc2V0IHVwIGEgW0dpdEh1YiBhY3Rpb25dKGh0dHBzOi8vZ2l0aHViLmNvbS9SZWFsaXR5QmVuZGluZy9UZW1wbGF0ZVJlc3VsdHMvYmxvYi9tYWluLy5naXRodWIvd29ya2Zsb3dzL3dlYnNpdGUueW1sKSB0aGF0IGdlbmVyYXRlcyBhbGwgdGhlIG91dHB1dCBmaWxlcyBldmVyeXRpbWUgc29tZW9uZSBjb21taXQgdG8gdGhlIHJlcG9zaXRvcnkuIFRoaXMgbWVhbnMgdGhhdCB0aGUgZmluYWwgZG9jdW1lbnRzIGhlcmUgYXJlIGFsd2F5cyAidXAtdG8tZGF0ZSIgd2l0aCB0aGUgKlJtZHMqIChhcyBzaG93biBieSB0aGUgZ3JlZW4gYmFkZ2UpLiBUaGF0IHNhaWQsIHlvdSBjYW4gcmVtb3ZlIHRoaXMgR2l0SHViIGFjdGlvbiAoanVzdCByZW1vdmUgdGhlIGAuZ2l0aHViL3dvcmtmbG93cy93ZWJzaXRlLnltbGAgZmlsZSkgaWYgeW91IHByZWZlciB0byBnZW5lcmF0ZSB0aGUgZG9jdW1lbnRzIG1hbnVhbGx5IG9ubHkuCgotICoqSG93IHRvIGFkZCByZWZlcmVuY2VzPyoqCgpSZWZlcmVuY2VzIGhhdmUgdG8gYmUgYWRkZWQgaW4gYGJpYmAgZm9ybWF0IGluIHRoZSBbKnV0aWxzL2JpYmxpb2dyYXBoeS5iaWIqXShodHRwczovL2dpdGh1Yi5jb20vUmVhbGl0eUJlbmRpbmcvVGVtcGxhdGVSZXN1bHRzL2Jsb2IvbWFpbi91dGlscy9iaWJsaW9ncmFwaHkuYmliKSBmaWxlLCBhbmQgZnVydGhlciByZWZlcmVuY2VkIGluIHRoZSB0ZXh0IGxpa2UgdGhpcyBgW0BsdWRlY2tlMjAxOWluc2lnaHRdYCBbQGx1ZGVja2UyMDE5aW5zaWdodF0uCgotICoqSXQgZG9lc24ndCB3b3JrIC8gSSBoYXZlIHF1ZXN0aW9ucyAvIEkgaGF2ZSBpZGVhcyoqCgpKdXN0IFsqKm9wZW4gYW4gaXNzdWUqKl0oaHR0cHM6Ly9naXRodWIuY29tL1JlYWxpdHlCZW5kaW5nL1RlbXBsYXRlUmVzdWx0cy9pc3N1ZXMpIGFuZCB3ZSdsbCBiZSBoYXBweSB0byBhc3Npc3Qg4pi6CgojIyBTdHJ1Y3R1cmUKCk1vc3QgZmlsZXMgdGhhdCB5b3UnbGwgbmVlZCB0byBjcmVhdGUgLyBlZGl0IHdpbGwgYmUgd3JpdHRlbiBpbiBbKipybWFya2Rvd24qKl0oaHR0cHM6Ly9ybWFya2Rvd24ucnN0dWRpby5jb20vbGVzc29uLTEuaHRtbCksIHdoaWNoIGNvbnNpc3RzIG9mIGEgbWl4IG9mIG1hcmtkb3duIHRleHQgYW5kIFIgY2h1bmtzIG9mIGNvZGUuCgpUaGUgbWFpbiBmaWxlIGlzIG5hbWVkIFsqKmluZGV4LlJtZCoqXShodHRwczovL2dpdGh1Yi5jb20vUmVhbGl0eUJlbmRpbmcvVGVtcGxhdGVSZXN1bHRzL2Jsb2IvbWFpbi9pbmRleC5SbWQpLiBIb3dldmVyLCB0byBhdm9pZCBoYXZpbmcgb3Zlcmx5IGxvbmcgZmlsZXMsIHRoZSBkaWZmZXJlbnQgKGFuZCBpbmRlcGVuZGVudCkgYW5hbHlzZXMgcGFydHMgYXJlIGFjdHVhbGx5IHNwbGl0IGluIG90aGVyIGRvY3VtZW50cy4gRm9yIGluc3RhbmNlLCBpbiB0aGlzIHRlbXBsYXRlIGV4YW1wbGUsIHRoZSBkZXNjcmlwdGl2ZSBzdGF0aXN0aWNzIHNlY3Rpb24gaXMgaW4gdGhlIFsqKjFfZGVzY3JpcHRpdmUuUm1kKipdKGh0dHBzOi8vZ2l0aHViLmNvbS9SZWFsaXR5QmVuZGluZy9UZW1wbGF0ZVJlc3VsdHMvYmxvYi9tYWluLzFfZGVzY3JpcHRpdmUuUm1kKSBmaWxlLiBBcyB5b3UgY2FuIFtzZWUgaW4gdGhlIGluZGV4IGZpbGVdKGh0dHBzOi8vZ2l0aHViLmNvbS9SZWFsaXR5QmVuZGluZy9UZW1wbGF0ZVJlc3VsdHMvYmxvYi82OTBmNzk0N2RhMGZjOGFjODVlYWY2ZmI4N2ZhZmVhYTQ2ZmIzYzUwL2luZGV4LlJtZCNMODktTDkwKSwgdGhpcyBmaWxlIGlzIHRoZW4gaW50ZWdyYXRlZCBhcyBhIGNoaWxkIGRvY3VtZW50IChpLmUuLCBpdCBpcyBtZXJnZWQpLiBUaGlzIG1ha2VzIGl0IHZlcnkgY29udmVuaWVudCB0byBoYXZlIGEgY2xlYXIgc3RydWN0dXJlIHdpdGggd2VsbC1vcmdhbml6ZWQgZmlsZXMsIHRoYXQgYXJlIHB1dCB0b2dldGhlciBvbmx5IHdoZW4gbWVyZ2VkLgoKIyMgUmVuZGVyIGFuZCBQdWJsaXNoCgpJbXBvcnRhbnRseSwgaW4gb3JkZXIgdG8gcmVuZGVyIGFsbCB0aGUgZmlsZXMsIGRvIG5vdCBLbml0IHRoaXMgZG9jdW1lbnQgYnkgcHJlc3NpbmcgdGhlICdLbml0JyBidXR0b24uIElmIHlvdSBkbywgaXQgd2lsbCBjcmVhdGUgYW4gb3V0cHV0IGZpbGUgKGZvciBpbnN0YW5jZSBgaW5kZXguaHRtbGApIGluIHRoZSByb290IGZvbGRlciwgYWxvbmdzaWRlIGBpbmRleC5SbWRgLiBUaGlzIGlzICoqbm90IHdoYXQgd2Ugd2FudCoqLCBhcyB3ZSB3YW50IHRvIGtlZXAgdGhlIG91dHB1dCBmaWxlcyB0aWR5IGluIHNlcGFyYXRlIGZvbGRlcnMgKGZvciBpbnN0YW5jZSwgdGhlIGh0bWwgdmVyc2lvbiBzaG91bGQgYmUgaW4gdGhlIGAvZG9jcy9gIGZvbGRlciwgYXMgdGhpcyBpcyB3aGVyZSB0aGUgd2Vic2l0ZSB3aWxsIGxvb2sgZm9yKS4gCgpUaGVyZSBhbiBSIHNjcmlwdCwgW3V0aWxzL3JlbmRlci5SXShodHRwczovL2dpdGh1Yi5jb20vUmVhbGl0eUJlbmRpbmcvVGVtcGxhdGVSZXN1bHRzL2Jsb2IvbWFpbi91dGlscy9yZW5kZXIuUiksIHRoYXQgY29udGFpbnMgdGhlIGxpbmVzIHRvIHJlbmRlciBldmVyeXRoaW5nIGluIGl0cyBjb3JyZWN0IGxvY2F0aW9uLiBTbywgd2hlbiB5b3UgaGF2ZSB0aGUgImluZGV4LlJtZCIgZmlsZSBvcGVuZWQgKGFuZCB5b3VyIHdvcmtpbmcgZGlyZWN0b3J5IGlzIGF0IGl0cyByb290KSwgc2ltcGx5IHJ1biAqKmBzb3VyY2UoInV0aWxzL3JlbmRlci5SIilgKiogaW4gdGhlIGNvbnNvbGUgKG9yIHRoZSByZWxldmFudCBsaW5lcyBpbiB0aGF0IGZpbGUpLiBUaGlzIHdpbGwgcnVuIHRoZSByZW5kZXJpbmcgZmlsZSBhbmQgY3JlYXRlIGFsbCB0aGUgZmlsZXMuCgojIyBDb250cmlidXRpb24KCkRvIG5vdCBoZXNpdGF0ZSB0byBpbXByb3ZlIHRoaXMgdGVtcGxhdGUgYnkgdXBkYXRpbmcsIGRvY3VtZW50aW5nLCBvciBleHBhbmRpbmcgaXQhIAoKCiMgUGFja2FnZXMgJiBEYXRhCgojIyBQYWNrYWdlcwoKYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1UUlVFLCByZXN1bHRzPSdhc2lzJ30KbGlicmFyeShlYXN5c3RhdHMpCgpzdW1tYXJ5KHJlcG9ydDo6cmVwb3J0KHNlc3Npb25JbmZvKCkpKQpgYGAKCiMjIERhdGEKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9VFJVRSwgcmVzdWx0cz0nYXNpcyd9CmRmIDwtIHJlYWQuY3N2KCJkYXRhL2RhdGEuY3N2IikKCmNhdChwYXN0ZSgiVGhlIGRhdGEgY29uc2lzdHMgb2YiLCAKICAgICAgICAgIHJlcG9ydDo6cmVwb3J0X3BhcnRpY2lwYW50cyhkZiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydGljaXBhbnRzID0gIlBhcnRpY2lwYW50IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdlID0gIkFnZSIpKSkKYGBgCgojIERlc2NyaXB0aXZlIFN0YXRzIHsudGFic2V0fQoKYGBge3IgY2hpbGQ9aWYgKGZhc3QgPT0gRkFMU0UpICcxX2Rlc2NyaXB0aXZlLlJtZCd9CmBgYAoKIyBGdWxsIENvZGUKClRoZSBmdWxsIHNjcmlwdCBvZiBleGVjdXRpdmUgY29kZSBjb250YWluZWQgaW4gdGhpcyBkb2N1bWVudCBpcyByZXByb2R1Y2VkIGhlcmUuCgpgYGB7ciBmdWxsX2NvZGUsIHJlZi5sYWJlbD1rbml0cjo6YWxsX2xhYmVscygpLCBldmFsPUZBTFNFfQpgYGAKCiMgUGFja2FnZSBSZWZlcmVuY2VzCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCByZXN1bHRzPSdhc2lzJ30KcmVwb3J0OjpjaXRlX3BhY2thZ2VzKHNlc3Npb25JbmZvKCkpCmBgYAoKCiMgUmVmZXJlbmNlcwo=